From 14e38da150516ffe5cece04de16fb3c976caa21f Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Mon, 20 Sep 2010 16:12:11 -0400 Subject: [PATCH] Only store error codes in inner-most X error trap When an error occurs with nested traps in place, only the innermost trap should have the error code stored in it; outer traps are shielded by the inner trap. https://bugzilla.gnome.org/show_bug.cgi?id=629608 --- gdk/x11/gdkdisplay-x11.c | 1 + tests/testerrors.c | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index 3b82590e3a..39862906ca 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -2721,6 +2721,7 @@ _gdk_x11_display_error_event (GdkDisplay *display, { ignore = TRUE; trap->error_code = error->error_code; + break; /* only innermost trap gets the error code */ } } diff --git a/tests/testerrors.c b/tests/testerrors.c index b8d1a8a812..d371f1b790 100755 --- a/tests/testerrors.c +++ b/tests/testerrors.c @@ -56,13 +56,22 @@ test_error_trapping (GdkDisplay *gdk_display) XSync (d, TRUE); - /* verify that we can catch with nested traps */ + /* verify that we can catch with nested traps; inner-most + * active trap gets the error */ gdk_error_trap_push (); gdk_error_trap_push (); XSetCloseDownMode (d, 12345); error = gdk_error_trap_pop (); g_assert (error == BadValue); error = gdk_error_trap_pop (); + g_assert (error == Success); + + gdk_error_trap_push (); + XSetCloseDownMode (d, 12345); + gdk_error_trap_push (); + error = gdk_error_trap_pop (); + g_assert (error == Success); + error = gdk_error_trap_pop (); g_assert (error == BadValue); /* try nested, without sync */ -- 2.30.2